Method and apparatus for incorporating application logic into a voice responsive system

ABSTRACT

A method and apparatus for incorporating application logic into a voice responsive system are described. The system includes a voice server to receive a request from a voice browser in response to user input. The voice server responds by accessing a VXML based call flow document to initiate a call flow. The call flow document may contain standard VXML tags as well as VXML extension elements. The VXML extension elements provide logic for the call flow, either explicitly or by referencing separate objects or functions. The voice server includes an engine to parse the call flow document, including identifying the VXML extension elements and other tags, and to invoke the appropriate code to execute the application logic based on the VXML extension elements. This approach allows application logic provided by “backend” servers to be included in a call flow.

[0001] A portion of the disclosure of this patent document containsmaterial which is subject to copyright protection. The copyright ownerhas no objection to the facsimile reproduction by any one of the patentdocument or the patent disclosure, as it appears in the Patent andTrademark Office patent file or records, but otherwise reserves allcopyright rights whatsoever.

FIELD OF THE INVENTION

[0002] The present invention pertains to voice responsive processingsystems. More particularly, the present invention relates to a methodand apparatus for incorporating application logic into a voiceresponsive processing system.

BACKGROUND OF THE INVENTION

[0003] Interactive Voice Response (IVR) systems may be defined toinclude automated processing systems capable of carrying out operationsin response to the human voice or dual tone multi-frequency (DTMF) tones(a.k.a. “touchtones”). A simple example of such a system is avoice-activated dialer, which responds to a user speaking the name of aperson to be called, by automatically dialing the appropriate telephonenumber. As a more sophisticated example, rapid progress is being made inthe development of a “voice web”. The voice web will be analogous to(and possibly integrated with) the well-known World Wide Web. However,the information maintained on the voice web will be primarily in audibleform, and users will access the information using speech or DTMF tones.More specifically, a user will access the voice web using a telephone orother standard audio equipment to operate a device known as a voicebrowser. The voice browser will respond to the user's spoken or keyedrequests to access information stored on a remote processing system, andwill provide the information to the user in audible form, such as in theform of recorded or synthesized speech.

[0004] Although the telephone is a common channel through which usersaccess IVR systems, such systems can also be accessed through othertypes of communication channels, such as by using a computer connectedto the Internet. Nonetheless, a session between a user and a voiceresponsive system may be referred to as a “call” regardless of the typeof communication channel used, and the sequence or logical structure ofthe call is often referred to as the “call flow”. A call flow normallyincludes application logic which defines the various conditions,decisions, branches, and other higher-level operations (i.e., the “flow”of the call) as well as various presentation features (i.e., theinput/output characteristics of the call).

[0005] It is desirable to allow the individuals and enterprises whomaintain and operate IVR systems to create or customize their callflows. With current technology, call flow customization requiresprogramming by development engineers. This results in additional cost interms of both time and money for development, quality assurance (QA),and release phases. Thus, if an enterprise wishes to modify some aspectof the call flow (e.g., to add a menu item), engineering developmenteffort is normally required.

[0006] With the advent of voice extensible markup language (VXML) andVXML browsers, it has become possible to create custom voiceapplications for IVR systems. VXML is a voice based analogue tohypertext markup language (HTML), and a VXML browser is a voice basedanalogue to an HTML browser, such as Microsoft Internet Explorer orNetscape Navigator. Like HTML, however, VXML is essentially apresentation language. That is, it does not provide the necessaryconstructs for building rich applications, such as unified communicationor unified messaging applications. For example, when using suchapplications, a user might wish to retrieve and listen to his newvoicemail messages. To do this, he typically has to first proceedthrough an authentication stage and then be presented with a list of newvoicemails. From this list, he may select messages to be played back,messages to be saved, and messages to be deleted. While VXML is able toprovide the presentation aspects of this interaction (e.g., prompts anda menu of choices mapped to DTMF keys of voice commands), it is unableto represent the sometimes-complex application logic required formanaging interactions with external systems, such as directories,message stores, and personal information management (PIM) servers.

[0007] Consequently, the application logic of call flows hastraditionally been encoded in a procedural language such as Perl or C.As a result, if an enterprise wishes to modify some aspect of the callflow, modification of that code is normally required, which involvesengineering development and QA effort, and therefore, additional cost.The current approach, therefore, is not conducive to creation orcustomization of call flows for IVR systems that have already beendeployed.

SUMMARY OF THE INVENTION

[0008] The present invention includes a method and apparatus to create aVXML based call flow document, for use by a server in a voice responsivesystem, to define a call flow. A VXML extension element is incorporatedinto the call flow document to provide application logic for the callflow. The call flow document is stored in the voice responsive system.

[0009] Other features of the present invention will be apparent from theaccompanying drawings and from the detailed description which follows.

BRIEF DESCRIPTION OF THE DRAWINGS

[0010] The present invention is illustrated by way of example and notlimitation in the figures of the accompanying drawings, in which likereferences indicate similar elements and in which:

[0011]FIG. 1 is a block diagram of an IVR system that incorporates logicinto a call flow using VXML extensions;

[0012]FIG. 2 is a block diagram showing the elements of the engine;

[0013]FIGS. 3A and 3B collectively form a flow diagram showing anoverall process for incorporating logic into a call flow using VXMLextensions;

[0014]FIG. 4 is a flow diagram showing the processing of an element in acall flow document; and

[0015]FIG. 5 is a block diagram of a processing system that can be usedto implement one or more of the elements shown in FIG. 1.

DETAILED DESCRIPTION

[0016] A method and apparatus for using VXML extensions to incorporateapplication logic into a voice responsive system are described. Notethat in this description, references to “one embodiment” or “anembodiment” mean that the feature being referred to is included in atleast one embodiment of the present invention. Further, separatereferences to “one embodiment” in this description do not necessarilyrefer to the same embodiment; however, neither are such embodimentsmutually exclusive, unless so stated and except as will be readilyapparent to those skilled in the art. Thus, the present invention caninclude any variety of combinations and/or i of the embodimentsdescribed herein.

I. Overview

[0017] As described in greater detail below, the solution describedherein includes a call flow language which extends VXML with a set ofcustom elements. These elements provide the necessary expressiveness forinteracting with middle tier servers, as well as expressing thenecessary application logic for a voice application. The set of elementsis easily and canonically extensible; that is, new elements can easilybe added to a running system on-the-fly.

[0018] The solution also provides a set of objects and functionsaccessible from this call flow language, that provide aggregate usefulcapabilities (e.g. playing a folder summary of new emails, faxes, andvoicemails) and that also export the ability to access key systemfunctionality, such as account profile information, voice mail messages,personal information management data (e.g. calendar and address book).The set of functions and objects is also easily extensible, such thatnew functions and objects can be added on-the-fly. In addition, thesolution includes a server framework for transparently managing suchthings as user sessions.

[0019] The IVR system described herein includes a voice server toreceive a request from a voice browser in response to user input. Thevoice server responds by accessing a VXML based call flow document toinitiate a call flow. The call flow document may contain standard VXMLtags as well as VXML extension elements. The VXML extension elements canbe used to provide application logic for the call flow, eitherexplicitly or by referencing separate objects or functions containingthe logic. The voice server includes an engine to parse the call flowdocument, including identifying the VXML extension elements and othertags, and to invoke appropriate code to execute the call flow logicbased on the VXML extension elements. This approach allows the inclusionof application logic provided by “backend” servers in a call flow.

II. IVR System and Process

[0020] Refer now to FIG. 1, which illustrates an example of an IVRsystem that incorporates logic into a call flow using VXML extensions,in accordance with the present invention. The system includes a voicebrowser 2, and an audio input/output (I/O) interface 1 by which the useraccesses a voice browser 2. The audio I/O interface 1 may be aconventional or cellular telephone, as shown, such that the user mayaccess the voice browser 2 over a conventional or wireless telephonenetwork by dialing a predetermined telephone number. In alternativeembodiments, however, the user can access the voice browser 2 throughother types of communication channels, such as the Internet or acorporate intranet (using, for example, IP telephony and/orVoice-over-IP).

[0021] The voice browser 2 operates in a manner that is analogous to aconventional HTML based web browser, except that it is responsive tovoice input from the user and is used to access hyperlinked audiocontent (as opposed to text, graphics, or video). The voice browser 2may be implemented in a conventional processing system, such as anAS5300 universal access server from Cisco Systems of San Jose, Calif.

[0022] The system also includes a voice server 3. The voice server 3provides VXML based content to the voice browser 2 over a standardhypertext transport protocol (HTTP) interface 8, in response to requestsfrom the voice browser 2 (which requests are transmitted in response tovoice input from the user). The system also includes one or more VXMLbased call flow documents 7, which may be (but do not have to be) storedwithin the voice server 3 in one or more conventional mass storagedevices. The call flow documents 7 define the call flow and are accessedby the voice server 3 in response to an initial request from the voicebrowser 2, to control the call. Hence, the call flow documents 7 are atleast a part of the “content” which a user accesses through the voicebrowser 2 and the voice server 3. The call flow documents 7 include bothstandard VXML as well as various new elements (tags) defined herein,which are referred to as VXML extension elements or custom elements. TheVXML extension elements are used to incorporate application logic intothe call flow and are described further below.

[0023] In one embodiment, the voice server 3 includes a standard webserver 5 (e.g., Apache) and a VXML extension engine (or simply “engine”)6. The engine 6 parses and interprets the extended VXML call flowdocuments. It has the ability to recognize standard VXML tags as well asthe extension elements, and includes code for implementing the logicrepresented by those elements. In one embodiment, the engine 6 includesa conventional, “off-the-shelf” PHP (Hypertext Preprocessor) scriptinglanguage interpreter. In one embodiment, the engine 6 also includesadditional code, which implements application logic represented bycustom elements, as well as various functions and objects (mentionedabove and described further below) which are invoked using customelements. The additional code may be written in PHP scripting language,Perl, and/or C programming language, for example. Referring still toFIG. 1, additional elements, functions and objects are stored inexternal element files 9, function files 10, and object files 11,respectively, for implementing application logic for a call flow.

[0024] The system also includes one or more backend servers 4. Thebackend servers 4 may contain application logic as well as other contentaccessible to the user via the voice browser 2 and voice server 3. TheVXML extension elements may be used to invoke and/or interact withapplication logic residing on the backend servers 4. As one example, aVXML extension element in a call flow document 7 may be used to invoke auser login/ authentication operation carried out by one of the backendservers 4.

[0025] An important advantage of this approach is that a call flow canbe modified on-the-fly in a running system, simply by modifying one ormore of the stored call flow documents 7.

[0026] An important service that the voice server 3 provides is sessionmanagement. As the user interacts with the system during a VXML session,certain application state must be captured and managed for the lifetimeof the session. For example, if as part of a call flow the user “logsin”—for example to retrieve voice mail—the system must keep track of theuser's authentication token and the fact that the user has logged in.This tracking and management is done by the voice server 3 and is hiddenfrom the call flow developer.

[0027]FIG. 2 shows the elements of the VXML extension engine 6,according to one embodiment. As shown, the engine 6 includes anexecution core 31 and a parser 32. The parser 32 is responsible forparsing call flow documents 7. The result of parsing a call flowdocument is a parse tree 33, which indicates to the execution core 31the sequence in which the elements of the call flow document should beprocessed. The execution core 31 executes a parsed call flow document byinvoking the element code, functions and/or objects represented by theelements in the document. The element code, functions and objects may beinternal to the engine 6, as is the case with internal element code 37,internal function code 38, and internal object code 39. Tables 34, 35and 36 contain mappings used by the execution core 31 to determine thestorage locations of the internal element code 37, internal functioncode 38 and internal object code 39, respectively, based on thereferencing extension elements. Other element code, objects, andfunctions are stored in external element files 9, function files 10, andobject files 11.

[0028]FIGS. 3A and 3B collectively show an overall process that may beexecuted by the system of FIG. 1 during a call, in accordance with thepresent invention. This process will now be described, also withreference to FIGS. 1 and 2. Initially, at block 301 a user initiates acall to the voice browser 2. The voice browser 2 answers the call atblock 302 and, at block 303, sends an HTTP request to the voice server 3specifying an initial uniform resource locator (URL). At block 304, theVXML extension engine 6 identifies and loads the base (main) call flowdocument of the set of call flow documents 7, based on the URL specifiedby the browser 2. Note that a call flow can be implemented within asingle call flow document or within multiple call flow documents. Theengine 6 then parses the call flow document into a parse tree at block305. At block 306, the engine 6 uses the parse tree to identify thefirst element (tag) in the call flow document, and at block 307 theengine processes the element in an appropriate manner, as describedbelow in greater detail.

[0029] After processing the element, at block 308 the engine 6determines from the parse tree whether there are additional elements tobe processed in the call flow document. If so, the engine 6 identifiesthe next element at block 311, and the process then continues from block307 (discussed above). If all of the elements in the call flow documenthave been processed, then the process continues from block 309. At block309, if the voice browser 2 has received another request from the user,it sends a request to the voice server 3 via HTTP with a specified URLat block 312. The engine 6 then retrieves the call flow documentcorresponding to the specified URL at block 313, and the process andcontinues from block 305. If no further request has been received and ifthe session is still active at block 310, then the process loops back toblock 309. If no further request has been received from the voicebrowser 2 and the session has terminated, the process ends. The durationof the process is open-ended, in that essentially any number of requestscan be received from the user and voice browser 2, depending on the typeof call flow being accessed.

[0030]FIG. 4 shows the process of block 307 in greater detail, accordingto one embodiment. Upon entering the process, at block 401 the engine 6determines whether the element currently being processed is an intrinsic(internal) custom element by consulting its table 34 of internalelements. If the element is an intrinsic custom element, then at block402 the engine 6 next determines whether the element is the <ivrObject>tag (discussed below), which is used to incorporate an object into thecall flow. If the element is the <ivrObject> tag, then the engine 6determines at block 403 whether the object being invoked in the tag isan intrinsic (internal) object, by consulting its table 36 of internalobjects.

[0031] If the object being invoked is an intrinsic object, the engine 6dispatches execution to its internal code that implements the object atblock 404, and the process then returns. The code which implements theobject may be, for example, a script written in PHP, Perl, or C.Execution of the object may include, for example, one or more localcomputations, or it may cause the voice server to interact with one ormore backend servers, if appropriate. The latter action can beaccomplished by calling one or more application program interfaces(APIs). Execution of the object may also include the generation ofadditional VXML code by the engine 6, which is passed to the voicebrowser.

[0032] If the object is not an internal object, the engine 6 determinesat block 409 if there is an external file available which implements theobject. In one embodiment, external files are assigned names that matchthe name of the corresponding element, function or object used in thetag, to allow the engine 6 to easily locate the correct file. If thereis such a file at block 409, then the engine 6 loads and executes thefile at block 410, and the process then returns. The file may include aPHP, Perl or C script, for example, and execution may involve actionssuch as described above regarding block 404. If there is no such file,the engine 6 outputs an appropriate error message to the calling entityat block 411, and the process then returns.

[0033] If the element currently being processed is an intrinsic customelement but is determined not to be the <ivrObject> tag at block 402,then the process branches from block 402 to block 404 (discussed above).

[0034] If the element currently being processed is determined not to bean intrinsic custom element at block 401, then the process branches toblock 405, in which the engine 6 determines if there is an external fileavailable which implements the element. If there is such a file, thenthe engine 6 loads and executes the file at block 406, and the processthen returns. The file may include a PHP, Perl or C script, for example,and execution may involve actions such as described above regardingblock 404. If there is no such file found at block 405, then the elementis determined not to be a custom element (i.e., it is a standard VXMLelement) at block 407. In that case, at block 407 the engine 6 performsany necessary variable expansions and invokes any functions that arerepresented in any expressions in the element, and then passes theelement (or the result of block 407) back to the calling entity at block408. The process then returns.

[0035] Of course, many variations upon the above-described process arepossible within the scope of the present invention. For example, thesequence of operations can be altered and/or operations can be added ordeleted while maintaining the essential nature of the process. Oneparticular variation, which will now be described, is directed toimproving the speed of execution of a call flow. The speed of executionwill depend, at least in part, on the scripting language(s) employed andthe particular version of the language(s). The above-described processesinvolve directly executing a requested call flow document by parsing itand calling the code which implements the custom elements in thedocument. This approach can be a time-consuming.

[0036] The following alternative process may be employed for overallfaster performance. This process eliminates the need to parse a callflow document each time it is requested. The first time a call flowdocument is requested by the voice browser, the engine 6 parses the callflow document and outputs into a file all of the code needed to executethe call flow document (e.g., PHP code representing elements, functionsand/or objects). The code may be located in the manner described abovein connection with FIG. 4. The next time the call flow document isrequested, however, if the document has not been modified since the filewas generated, the engine 6 simply executes the code from the file. Ifthe document has been modified since the file was generated, the engine6 will regenerate the file from the modified document, and execute thecall flow document.

[0037]FIG. 5 is a block diagram showing an example of a processingsystem that can be used to implement any of the elements shown inFIG. 1. Note that FIG. 5 is not intended to represent any one specificphysical arrangement of components, as such details are not germane tothe present invention and are well within the knowledge of those skilledin the art. In addition, note that the elements shown in FIG. 1 may bedistributed among two or more such processing systems, which may beconnected to each other on a network or on an internetwork. The networkor internetwork may be or may include, for example, a local area network(LAN), a wide area network (WAN), an corporate intranet, or theInternet, or a combination thereof. Each such physical machine may be,for example, a conventional personal computer (PC) or server-classcomputer. Note that the audio I/O interface 1 may also be implemented ina computer, as opposed to a conventional telephone; in that case, thecomputer might be a personal digital assistant (FDA) or any other typeof computing device.

[0038] The processing system shown in FIG. 5 includes a processor 41,read-only memory (ROM) 42, and random access memory (RAM) 43, eachconnected to a bus system 48. The processor 41 may be or may include ageneral-purpose programmable microprocessor, for example. The bus system48 may include one or more buses connected to each other through variousbridges, controllers and/or adapters, such as are well-known in the art.For example, the bus system 48 may include a “system bus” that isconnected through an adapter to one or more expansion buses, such as aperipheral component interconnect (PCI) bus or an extended industrystandard architecture (EISA) bus. Also coupled to the bus system 48 area mass storage device 44, a number of input/output (I/O) devices 45-1through 45-N, and a data communication device 46. Examples of what I/Odevices 45 might include are a keyboard, a pointing device (e.g., mouse,touchpad or trackball), a display device, and an audio speaker.

[0039] Mass storage device 44 includes a storage medium suitable forstoring large volumes of data in a non-volatile manner, such as amagnetic disk or tape, magneto-optical (MO) storage device, or any ofvarious types of Digital Versatile Disk (DVD) or Compact Disk (CD) basedstorage. Data communication device 46 provides data communicationbetween the illustrated processing system and one or more other(possibly remote) processing systems over a communications link 47.Hence, data communication device 46 may be, for example, a conventionaltelephone modem, an Integrated Services Digital Network (ISDN) adapter,a Digital Subscriber Line (DSL) modem, a cable modem, a satellitetransceiver, an Ethernet adapter, or a combination thereof.

[0040] Of course, many variations upon the architecture shown in FIG. 5can be made to suit the needs of a particular machine. Thus, certaincomponents may be added to those shown in FIG. 5 for a particularmachine, or certain components shown in FIG. 5 may be omitted from aparticular machine. For example, a server such as the voice server orbackend servers does not necessarily require I/O devices designed tointerface directly with a user, such as a keyboard, a pointing device,and a display device.

III. VXML Extension Elements

[0041] The VXML extension elements (tags) will now be described ingreater detail. First, each extension element will be briefly described,by category. A more complete description is given below (see section“VII”). Of course, additional extension elements may be defined, evenafter deployment of a system; in fact, the solution described hereinfacilitates the creation of new extension elements by those who maintainand operate IVR systems.

[0042] A. Document Structure

[0043] The following extension elements relate to document structure:

[0044] ivrCallFlow—This is the topmost element in a call flow document.It identifies the name of the call flow, as well as the first page inthe call flow.

[0045] ivrPage—Defines a page, in which all other tags will becontained.

[0046] ivrExternalPage—Defines an external page. The file containing thepage will be read when an attempt is made to execute the page.

[0047] ivrBlock—Used to group statements together into a block. The mainuse for ivrBlock is to enclose multiple tags in an include file into asingle tag. Other uses are to help organize multiple statements, such asall the tags belonging to an <ivrElse/> tag.

[0048] ivrInclude—Includes the specified file. The pathname is relativeto the callflows directory. The file will not be included until theivrInclude tag is executed.

[0049] B. Control Flow

[0050] The following extension elements relate to control flow:

[0051] ivrIf, ivrElseIf, and ivrElse—Implement conditional control flowmuch like conventional if/then/else programming language construct.

[0052] ivrSwitch, ivrCase, and ivrDefault—implements a switch-likeconstruct. The expression in the ivrSwitch tag is evaluated once, andthen compared to each expression in the ivrCase tags until the two areequal. If they are equal, then any tags up to the next ivrCase,ivrDefault, or ivrSwitch tags are executed. If none of the ivrCaseexpressions matches and there is an ivrDefault tag, any tags after thattag will be executed.

[0053] ivrForEach—Enumerates over each element in an array. Sets localvariable {variable}_key and {variable}_val for each key and value. exprshould be a PHP expression that evaluates to an array.

[0054] ivrGotoFlow—Updates session data and emits a <goto> tag thatstarts executing the specified call flow. Also places the session id inthe URL, as well as the server name and port for server affinity.

[0055] ivrReturn—Stops processing any more tags on the current page.Useful when it is necessary to do checks at the start of page that mightresult in an error condition or a goto and one does not want the rest ofthe page executed and/or want to have to enclose the rest of the page inan <ivrElse/> tag.

[0056] C. Audio Output

[0057] The following extension elements relate to audio output:

[0058] ivrPrompt—Outputs VXML <audio> tags to play various ivr(interactive voice response) prompts. Deals with internationalizationand localization issues by locating the localized prompt files or sayinga number/date in the localized format.

[0059] ivrPhrase, ivrPhraseCond, and ivrPhraseValue—Plays a phrase bylooking it up in the phrase file for the current locale. A phrase iseither text-to-speech (TTS)-based or based on static prompts.ivrPhraseValue's are used to set phrase variables, and ivrPhraseCond'sare used to set phrase conditions.

[0060] D. Events

[0061] The following extension elements relate to events:

[0062] ivrNoInput—Used to implement a consistent VXML “no input” handlerpolicy

[0063] ivrNoMatch—Used to implement a consistent VXML “no match” handlerpolicy

[0064] E. Miscellaneous

[0065] Other extension elements include the following:\

[0066] ivrDtmfDigits—Used to specify fixed length digits DTMF grammar ina portable way

[0067] ivrVar—When used within the scope of an <ivrPage> tag, sets avariable which lasts for the duration of a page. That variable willoverride any ivrVar set in a call flow, or any PHP global variable (suchas a URL query parameter). When used within the scope of an <ivrVars>tag, sets a variable that can be accessed within any <ivrPage>. Thevalue can either be a “value” or an “expr”. An “expr” is evaluated,while a “value” is not.

[0068] ivrObject—Invokes an “object”, and passes parameters to it. Thevalue of a parameter can either be a “value” or an “expr”. An “expr” isevaluated, while a “value” is not.

IV. Call Flow Documents

[0069] Examples will now be described of call flow documents whichinclude the above-mentioned VXML extension elements and which illustratethe manner of their use.

[0070] A. Top Level Call Flow

[0071] The following is an example of an extended VXML file which may beused to specify the top level call flow. It contains some globalvariables which are used throughout the call flow. It also containsreferences to the pages which are a part of the call flow. The systemuses the <ivrExternalPage> tag to only load pages when they areaccessed—thus it is a declaration mechanism which is used to optimizethe parsing of the call flow.

[0072] B. Main Page

[0073] The main page is the first page that is loaded by the engine. Itdetermines the account which should be accessed based on various phonenumber information and dispatches accordingly. For the purposes of thisexample, it is assumed that a “regular” account is being accessed andthe user is being taken to the message drop-off page (described below).

VI. Functions and Objects

[0074] As noted above, the solution described herein provides a set ofobjects and functions accessible from the call flow language, thatprovide application logic for call flows (e.g., playing a folder summaryof new emails, faxes, and voicemails) and that also export the abilityto access key system functionality, such as account profile information,voice mail messages, personal information management data (e.g. calendarand address book). The set of functions and objects is easilyextensible, such that new functions and objects can be added on-the-fly.The following description describes examples of these functions andobjects.

[0075] A. Functions

[0076] The following functions are examples of functions which may beincluded in the described system. Of course, additional functions can bedefined, and these functions can be added to the system on-the-fly. Foreach function described below, the function name, syntax, anddescription of the function are given, along with any applicablerestrictions, and where appropriate, examples of usage.

[0077] name: ivrSetFolder

[0078] syntax: ivrSetFolder($newFolder)

[0079] description: changes the current folder to the specified folder

[0080] restrictions: can only be called after ivrLogin has returnedsuccess

[0081] returns: 1 on success, 0 on error

[0082] example:

[0083] <ivrIf cond=“ivrSetFolder(‘${folder}’)”>

[0084] . . .

[0085] </ivrIf>

[0086] name: ivrLoadFolderList

[0087] syntax: ivrLoadFolderList( )

[0088] description: can be called to explicitly load the folder list.The folder list also gets loaded when calling ivrFolderCount( ) andivrGetFolders( ).

[0089] restrictions: can only be called after ivrLogin has returnedsuccess

[0090] returns: 1 on success, 0 on error

[0091] name: ivrFolderCount

[0092] syntax: ivrFolderCount( )

[0093] description: returns the number of folders a user has

[0094] restrictions: can only be called after ivrLogin has returnedsuccess

[0095] returns: number of folders on success, 0 on error.

[0096] name: ivrGetFolders

[0097] syntax: ivrGetFolders($offset=0, $max=0)

[0098] description: returns a list of folder names, starting at thespecified offset. Returns at most $max number of folders, or all if $maxis 0. When offset is 0, INBOX and Trash will always be the first twofolders in the list.

[0099] restrictions: can only be called after ivrLogin has returnedsuccess

[0100] returns: the list of folder names

[0101] name: ivrUrlEncode

[0102] syntax: ivrUrlEncode($string)

[0103] description: url encodes the input string

[0104] restrictions: none

[0105] returns: the url-encoded string

[0106] name: ivrFolder

[0107] syntax: ivrFolder( )

[0108] description: returns the current folder, which is initially INBOXafter a successful login.

[0109] restrictions: can only be called after ivrLogin has returnedsuccess

[0110] returns: the current folder name

[0111] examples:

[0112] name: ivrInTrash

[0113] syntax: ivrInTrash( )

[0114] description: shorthand for “IvrFolder( )==‘Trash’”.

[0115] restrictions: can only be called after ivrLogin has returnedsuccess

[0116] returns: 1 if the current folder is Trash, 0 otherwise.

[0117] examples:

[0118] name: ivrInInbox

[0119] syntax: ivrInInbox( )

[0120] description: shorthand for “IvrFolder( )==‘INBOX’”.

[0121] restrictions: can only be called after ivrLogin has returnedsuccess

[0122] returns: 1 if the current folder is INBOX, 0 otherwise.

[0123] examples:

[0124] name: ivrHasFeature

[0125] syntax: ivrHasFeature($features)

[0126] description: returns true if the specified feature(s) are presentin the OW.IvrFeatures account attribute. Multiple features can beseparated by commas, and an “!” can be used to check if the specifiedfeature is not enabled.

[0127] restrictions: can only be called after ivrLogin has returnedsuccess

[0128] returns: 1 on success, 0 on error

[0129] examples:

[0130] <ivrIf cond=“ivrHasFeature(‘TTS,Email’)”>

[0131] . . .

[0132] </ivrIf>

[0133] <ivrIf cond=“ivrHasFeature(‘!TTS’)”>

[0134] . . .

[0135] </ivrIf>

[0136] name: ivrPref

[0137] syntax: ivrPref($param)

[0138] description: returns the value of the param contained withinOW_p.IvrPrefs

[0139] restrictions: can only be called after either ivrLogin orivrGetPhoneInfo has returned success

[0140] returns: value of attribute

[0141] examples: ivrPref(‘DateTime’)==‘Y’

[0142] name: ivrGetAttr

[0143] syntax: ivrGetAttr($attr, $param=″″, $default=″″)

[0144] description: returns the value of the specified attribute. Ifparam is specified, only the specified parameter within the attribute isreturned. If default is specified and the attribute is not set or ″″,then the value of default will be used.

[0145] restrictions: can only be called after either ivrLogin

[0146] returns: value of attribute

[0147] examples: ivrGetAttr(‘OW_p.IvrPrefs’, ‘DateTime’)==‘Y’ivrGetAttr(‘TimeZone’)

[0148] name: ivrValidPin

[0149] syntax: ivrValidPin($pin)

[0150] description: returns true if $pin is a string of exactly 4digits.

[0151] restrictions: can only be called after ivrLogin has returnedsuccess

[0152] returns: 1 if the pin is valid, 0 otherwise.

[0153] name: ivrLogin

[0154] syntax: ivrLogin($pin)

[0155] description: attempts to login to the back end.

[0156] restrictions: can only be called after the ivrGetPhoneStatusobject has been called. If this function returns success, the pin hasbeen verified and the user authenticated. The variable $LC will also beset to the user's locale.

[0157] returns: IvrLoginok on success, IvrLoginAuthError for a bad pinor non-existent account, and IvrLoginSystemError for a general systemerror.

[0158] name: ivrAutoLogin

[0159] syntax: ivrAutoLogin( )

[0160] description: attempts to auto-login to the back end. auto-loginis only valid for phones that are directly assigned.

[0161] restrictions: can only be called after the ivrGetPhoneStatusobject has been called. If this function returns success, the PIN hasbeen verified and the user authenticated. The variable $LC will also beset to the user's locale.

[0162] returns: same values as ivrLogin

[0163] name: ivrChangePin

[0164] syntax: ivrChangePin($newPin)

[0165] description: changes the pin to $newPin

[0166] restrictions: can only be called after ivrLogin has returnedsuccess

[0167] returns: 1 on success, 0 on error

[0168] name: ivrSetDateTime

[0169] syntax: ivrSetDateTime($isOn)

[0170] description: turns the DateTime parameter on if $isOn isnon-zero, otherwise turns it of.

[0171] restrictions: can only be called after ivrLogin has returnedsuccess

[0172] returns: 1 on success, 0 on error

[0173] name: ivrEmptyTrash

[0174] syntax: ivrEmptyTrash( )

[0175] description: empties the Trash folder

[0176] restrictions: can only be called after ivrLogin has returnedsuccess

[0177] returns: 1 on success, 0 on error

[0178] name: ivrMailboxFull

[0179] syntax: ivrMailboxFull( )

[0180] description: returns true if the mailbox is full, i.e. the useris over quota

[0181] restrictions: can only be called after ivrLogin has returnedsuccess

[0182] returns: returns true if the mailbox is full

[0183] name: ivrSetGreeting

[0184] syntax: ivrSetGreeting($greeting_type, $greeting_id)

[0185] description: sets the greeting type to be used for the specifiedgreeting_id. greeting_id is tied to particular phone numbers in theuser's account, which can have different greetings. A greeting_id of “0”represents the default account greetings. greeting_type can be any of“standard”, “alternate”, “long”, “default” and “number”.

[0186] restrictions: can only be called after ivrLogin has returnedsuccess

[0187] returns: 1 on success, 0 on error

[0188] name: ivrGreetingUrl

[0189] syntax: ivrGreetingUrl($greeting_type, $greeting_id)

[0190] description: returns a (relative) URL that will return the audiofor the specified greeting. See ivrSetGreeting( ) for a description ofgreeting_type and greeting_id.

[0191] returns: a relative URL for playing the specified greeting

[0192] name: ivrHasGreeting

[0193] syntax: ivrHasGreeting($greeting_type, $greeting_id)

[0194] description: returns true or false based on whether the user hasa greeting of the specified type set for the specified greeting_idnumber. See ivrSetGreeting( ) for a description of greeting_type andgreeting_id.

[0195] restrictions: can only be called after ivrLogin has returnedsuccess

[0196] returns: 1 if user has the specified greeting, 0 if not

[0197] name: ivrCheckedGreetings

[0198] syntax: ivrCheckedGreetings( )

[0199] description: keeps track of whether we have prompted the user topersonalize their greetings during this session. If a user has nocustomized greetings we will remind him to set one up every time theylog in.

[0200] restrictions: can only be called after ivrLogin has returnedsuccess

[0201] returns: 1 if check has already been done, 0 if not

[0202] name: ivrNeedsGreetings

[0203] syntax: ivrNeedsGreetings( )

[0204] description: checks to see whether the user has set up a standarddefault greeting. If a user has no customized greetings we will remindthem to set one up every time they log in.

[0205] restrictions: can only be called after ivrLogin has returnedsuccess

[0206] returns: 1 if they have the standard greeting, 0 if not

[0207] name: ivrGreetingSave

[0208] syntax: ivrGreetingSave($greeting_type, $greeting_id)

[0209] description: sets the user's greeting for this greeting_id justas ivrSetGreeting( ) does, but will also store a newly recorded voicegreeting, if it's available. The greeting audio is assumed to beavailable in the global “vm” form variable. See ivrSetGreeting( ) for adescription of greeting_type and greeting_id.

[0210] restrictions: can only be called after ivrLogin has returnedsuccess

[0211] returns: 1 on success, 0 on failure

[0212] name: ivrHasMultipleNumbers

[0213] syntax: ivrHasMultipleNumbers( )

[0214] description: checks to see whether the user has multiple phonenumbers of any type associated with their account.

[0215] restrictions: can only be called after ivrLogin has returnedsuccess

[0216] returns: 1 if they have multiple phone numbers, 0 if not

[0217] name: ivrListPhones

[0218] syntax: ivrListPhones( )

[0219] description: returns a list of the phone numbers associated withthe current account. This will include both NANP and IDP numbers incanonical form, and will only return the first eight phone numbers ifthere are more.

[0220] restrictions: can only be called after ivrLogin has returnedsuccess

[0221] returns: a list of phone numbers in canonical form

[0222] name: ivrPhonePart

[0223] syntax: ivrPhonePart($phone_number)

[0224] description: $phone_number is either or NANP or IDP number incanonical form, and this will parse the number and return everything butthe extension part.

[0225] returns: the string $phone_number minus the extension part

[0226] name: ivrExtPart

[0227] syntax: ivrExtPart($phone_number)

[0228] description: $phone_number is either or NANP or IDP number incanonical form, and this will parse the number and return only theextension part.

[0229] returns: just the extension part of $phone_number

[0230] name: ivrPhoneGid

[0231] syntax: ivrPhoneGid($phone_index)

[0232] description: $phone_index is the index into the list of theuser's NANP and IDP phone numbers. This will return the greeting_idassociated with the specified number. If the phone number does notcurrently have one, one will get assigned.

[0233] restrictions: can only be called after ivrLogin has returnedsuccess

[0234] returns: greeting_id of the corresponding phone number

[0235] name: ivrAddEmailRecipient

[0236] syntax: ivrAddEmailRecipient($addressbook_entry_index)

[0237] description: adds the email address from an entry in the user'saddress book to the list of recipients of the message he is about tosend. The index refers to the index of the entry in the list ofcurrently selected address book entries.

[0238] restrictions: can only be called after ivrLogin has returnedsuccess

[0239] returns: 1 if successful, 0 if the entry has no useable emailaddress

[0240] name: ivrAddPhoneRecipient

[0241] syntax: ivrAddPhoneRecipient($phone_number, $extension)

[0242] description: looks up the provided phone number and extension inour system, and if it represents another user of the service, adds theemail address of that user to the list of recipients of the messageabout to be sent. Returns an error if the provided phone number andextension don't represent another user of the service.

[0243] restrictions: can only be called after ivrLogin has returnedsuccess

[0244] returns: 1 on success, 0 if number is a user of the system

[0245] name: ivrNeedExtension

[0246] syntax: ivrNeedExtension($phone number_without_extension)

[0247] description: looks up the provided phone number in our system anddetermines whether it is a shared phone number and therefore anextension is needed to identify the associated user.

[0248] returns: 1 if an extension is needed, 0 if the number does notneed an extension or the number is not in our system

[0249] name: ivrMsgMoreParts

[0250] syntax: ivrMsgMoreParts( )

[0251] description: while playing a particular message, checks to see ifthere are more message parts or chunks of TTS text to play.

[0252] restrictions: must be used in the context of playing back aparticular message with ivrMsgContent object

[0253] returns: 1 if the message has more parts, 0 if not

[0254] name: ivrABSelectedCount

[0255] syntax: ivrABSelectedCount( )

[0256] description: returns the number of currently selected addressbook entries. Entries are selected with the ivrABMatches( ) function. Ifthat function is not called first this function will just return thetotal number of address book entries.

[0257] restrictions: can only be called after ivrLogin has returnedsuccess

[0258] returns: number of selected address book entries

[0259] name: ivrAddressBookCount

[0260] syntax: ivrAddressBookCount( )

[0261] description: returns the total number of address book entries inthe user's address book.

[0262] restrictions: can only be called after ivrLogin has returnedsuccess

[0263] returns: number of entries in the address book.

[0264] name: ivrGetABEntries

[0265] syntax: ivrGetABEntries($field, $offset=0, $max=0);

[0266] description: setting $field to “name” will return a list ofaddress book entry identifying strings for TTS, anything else willreturn a list of the address book entry indexes, from the currentlyselected list of entries. It starts at the specified offset and returnsat most $max number of entries, or all if $max is 0.

[0267] restrictions: can only be called after ivrLogin has returnedsuccess

[0268] returns: list of address book entry identifying strings orindexes into the currently selected list. The identifying string isintended for TTS playback of a list of entries, and is set to the firstavailable fields from (FirstName,LastName) or the NickName, or theEmailAddress.

[0269] name: ivrABMatches

[0270] syntax: ivrABMatches($partial, $email_flag)

[0271] description: searches the user's address book for entries thatmatch the dtmf digit string $partial as a prefix of any of the fieldsNickName, FirstName or LastName. $partial is turned into a regularexpression based on the characters on the telephone keypad correspondingto the dtmf digits that were entered. For instance, the dtmf sequence“53” would get converted to the regular expression “^[J-Lj-15][D-Fd-f3]” which would then be matched against the above fieldsin all address book entries.

[0272] Setting $email_flag to “1” will only match address book entriesthat have an EmailAddress defined. This is used when selectingrecipients for sending messages.

[0273] The matching entries are stored in the session for subsequentaddress book operations, such as ivrGetABEntries and ivrABSelectedCount.

[0274] restrictions: can only be called after ivrLogin has returnedsuccess

[0275] returns: the number of matched address book entries, 0 if nomatches and −1 if $email_flag=1 and none of the otherwise matchedentries had defined EmailAddress fields

[0276] name: ivrPhone

[0277] syntax: ivrPhone(‘attr’)

[0278] description: returns the specified attribute associated with thecurrent phone.

[0279] restrictions: can only be called after the ivrGetPhoneInfo objecthas been called.

[0280] Valid attributes are:

[0281] ‘IVR’

[0282] description: returns the flow type of the current phonenumber.

[0283] returns: the flow, which will be one of these contants:

[0284] IvrFlowOnebox

[0285] IvrFlowComverse

[0286] IvrFlowOctel

[0287] ‘PrimaryType’

[0288] ‘TargetType’

[0289] description: returns the primary/target type of a phone

[0290] returns: the phone type, which will be one of these constants:

[0291] IvrTypePoolDtmf

[0292] IvrTypePoolDid

[0293] IvrTypeDirect

[0294] IvrTypeTargetWireless

[0295] IvrTypeTargetForward

[0296] IvrTypeTargetPrompt

[0297] IvrTypeTargetPickup

[0298] IvrTypeUndefined

[0299] IvrTypeError

[0300] ‘CallerCanonical’

[0301] ‘PrimaryCanonical’

[0302] ‘RdnCanonical’

[0303] ‘PoolId’

[0304] ‘ID’

[0305] name: ivrPhoneStatus

[0306] syntax: ivrPhoneStatus( )

[0307] description: returns the status of a phone

[0308] restrictions: can only be called after the ivrGetPhoneInfo objecthas been called.

[0309] returns: the phone number's status, which will be one of theseconstants:

[0310] IvrStatusAccountActive

[0311] IvrStatusNotInService

[0312] IvrStatusAccountMaintenance

[0313] IvrStatusNoSuchPhone

[0314] IvrStatusError

[0315] name: ivrGetMsg

[0316] syntax: ivrGetMsg( )

[0317] description: gets information about the current message from thebackend server. should be called before any of the ivrMsg* functions areused.

[0318] restrictions: can only be called after the ivrOrderFolder objecthas been called

[0319] returns: one of the following constants:

[0320] IvrGetMsgOk—the message is ready

[0321] IvrGetMsgGone—the requested message no longer exists

[0322] IvrGetMsgEmpty—there are no messages in this folder

[0323] IvrGetMsgNoMore—there are no more messages in this folder

[0324] name: ivrFinishMsg

[0325] syntax: ivrFinishMsg($op)

[0326] description: finishes with the current message, so the next callto ivrGetMsg will operate on the next message

[0327] $op should be one of the following constants:

[0328] IvrMsgOpDelete—message was deleted

[0329] IvrMsgOpSave—message was saved

[0330] IvrMsgOpGone—message no longer exists or couldn't be played

[0331] IvrMsgOpSkip—message was skipped

[0332] restrictions: can only be called after ivrGetMsg

[0333] returns: 1 on success, 0 on error

[0334] name: ivrDeleteMsg

[0335] syntax: ivrDeleteMsg( )

[0336] description: deletes the current message

[0337] restrictions: can only be called after ivrGetMsg( )

[0338] returns: 1 on success, 0 on error

[0339] name: ivrMsgFirstTime

[0340] syntax: ivrMsgFirstTime( )

[0341] description: used to determine if this is the first timeivrGetMsg has been called on the current message.

[0342] restrictions: can only be called after ivrGetMsg( )

[0343] returns: if this is the first time we have called ivrGetMsg onthe current message returns 1, otherwise returns 0.

[0344] example: <ivrIf cond=“ivrMsgIsEmail() &amp;&amp;ivrMsgFirstTime()”>  <ivrPrompt>tolistenmsgp1</ivrPrompt> <ivrElse/> <ivrPrompt>toreplayp1</ivrPrompt> </ivrIf>

[0345] name: ivrFolderFirstMsg

[0346] syntax: ivrFolderFirstMsg( )

[0347] description: returns 1 if this is the first message in the folder

[0348] restrictions: can only be called after ivrGetMsg( )

[0349] returns: returns 1 if this is the first message in the folder

[0350] name: ivrMsgSendUrl

[0351] syntax: ivrMsgSendUrl($page)

[0352] description: returns a URL that when used in a <goto> will resultin the current message being sent/forwarded/replied to.

[0353] restrictions: can only be called after ivrGetMsg

[0354] returns: a URL

[0355] name: ivrMsgContentUrl

[0356] syntax: ivrMsgContentUrl( )

[0357] description: returns a URL suitable for use in an <audio> tagthat will play the current message

[0358] restrictions: can only be called after ivrLogin has returnedsuccess

[0359] returns: a URL

[0360] example:

[0361] <audio caching=“safe” src=“${{ivrMsgContentUrl( )}}”//>

[0362] name: ivrMsgSeen

[0363] syntax: ivrMsgSeen( )

[0364] description: returns 1 if the current message has been seen

[0365] restrictions: can only be called after ivrGetMsg has been called

[0366] name: ivrMsgCanReply

[0367] syntax: ivrMsgCanReply( )

[0368] description: returns 1 if user is allowed to reply to the currentmessage (i.e., its not from a system account)

[0369] restrictions: can only be called after ivrGetMsg has been called

[0370] name: ivrMsgIsFax

[0371] syntax: ivrMsgIsFax( )

[0372] description: returns 1 if the current message is a fax message

[0373] restrictions: can only be called after ivrGetMsg has been called

[0374] name: ivrMsgIsVoice

[0375] syntax: ivrMsgVoice( )

[0376] description: returns 1 if the current message is a voice message

[0377] restrictions: can only be called after ivrGetMsg has been called

[0378] name: ivrMsgIsEmail

[0379] syntax: ivrMsgIsEmail( )

[0380] description: returns 1 if the current message is an email message

[0381] restrictions: can only be called after ivrGetMsg has been called

[0382] name: ivrFolderOrderType

[0383] syntax: ivrFolderorderType( )

[0384] description: returns the type passed into the ivrOrderFolderobject (i.e., ‘e’,‘f’,‘v’).

[0385] restrictions: can only be called after the ivrOrderFolder objecthas been called

[0386] name: ivrMsgOpUrl

[0387] syntax: ivrMsgOpUrl($page, $op)

[0388] description: used to generate a URL that can be used in a<choice> or <goto>tag. $page should be set to the page that handlesoperations, and $op should be one of the following constants:

[0389] IvrMsgOpDelete—delete the current message

[0390] IvrMsgOpEnv—play the message envelope

[0391] IvrMsgOpGone—current message no longer exists

[0392] IvrMsgOpSave—save the current message

[0393] IvrMsgOpSkip—skip the current message

[0394] restrictions: can only be called after ivrGetMsg has been called

[0395] returns: a URL

[0396] example:

[0397] <choice dtmf=“2” next=“${{ivrMsgOpUrl(‘messages’,IvrMsgOpSave)}}”/>

[0398] name: ivr

[0399] syntax: ivr

[0400] description:

[0401] restrictions: can only be called after ivrLogin has returnedsuccess returns: 1 on success, 0 on error

[0402] name: ivrGetAppts

[0403] syntax: ivrGetAppts($date)

[0404] description: loads the calendar apppointment list for a givendate (MMDDYY format)

[0405] restrictions: can be called only after ivrLogin has returnedsuccess

[0406] returns: 1 if appointment list retrieved successfully, 0 on error

[0407] example:

[0408] <ivrVar name=“apptCount” expr=“ivrGetAppts(‘040201’)”/>

[0409] name: ivrGetApptsCount

[0410] syntax: ivrGetApptsCount( )

[0411] description: retrieves the count of the the number ofappointments for the appointment list last loaded by ivrGetAppts( )

[0412] restrictions: can be called only after ivrGetAppts has returnedsuccess

[0413] returns: a count of the number of appointments. It will return 0if no appointments were found.

[0414] example:

[0415] <ivrVar name=“apptCount” expr=“ivrGetApptsCount( )”/>

[0416] name: ivrGetApptList

[0417] syntax: ivrGetApptList($apptsPerPage, $page)

[0418] description: retrieves an array of appointments for theappointment list last loaded by ivrGetAppts( )

[0419] restrictions: can be called only after ivrGetAppts has returnedsuccess

[0420] returns: returns an array of appointment information. The valueat each index is a delimited string of the format:

[0421] {apptid};{allday};{starttime};{recurrenceID}.

[0422] The delimiter is not necessarily a semicolon. It is defined byIvrCalDelim

[0423] example:

[0424] <ivrForEach var=“appt” expr=“ivrGetApptList(5, 0)”>

[0425] // you can now act upon the array returned by ivrGetApptList

[0426] //the keys and values are accessed by ${appt_key} and

[0427] // ${appt_val} respectively

[0428] //See calApptList.pg for full example

[0429] </ivrForEach>

[0430] name: ivrGetTasks

[0431] syntax: ivrGetTasks($date)

[0432] description: loads the tasks due for a given date (MMDDYY format)

[0433] restrictions: can be called only after ivrLogin has returnedsuccess

[0434] returns: 1 if tasks retrieved successfully, 0 if error

[0435] example:

[0436] <ivrVar name=“taskCount” expr=“ivrGetTasks(‘040201’)”/>

[0437] name: ivrGetTasksCount

[0438] syntax: ivrGetTasksCount( )

[0439] description: retrieves the count of the task due for last date oftasks loaded by ivrGetTasks( )

[0440] restrictions: can be called only after ivrGetTasks has returnedsuccess

[0441] returns: a count of the number of tasks due. It will return 0 ifno tasks were found or an error has occurred.

[0442] example:

[0443] <ivrVar name=“taskCount” expr=“ivrGetTasksCount( )”/>

[0444] name: ivrGetTaskList

[0445] syntax: ivrGetTaskList( )

[0446] description: retrieves an array of tasks due for last date oftasks loaded by ivrGetTasks( )

[0447] restrictions: can be called only after ivrGetTasks has returnedsuccess

[0448] returns: returns an array of tasks information. The value at eachindex is a delimited string of the format{datedue};{summary};{description The delimiter is not necessarily asemicolon. It is defined by IvrCalDelim

[0449] example:

[0450] <ivrForEach var=“task” expr=“ivrGetTasktList( )”>

[0451] //you can now act upon the array returned by ivrGetTaskList

[0452] //the keys and values are accessed by ${task_key} and

[0453] // ${task_val} respectively

[0454] //See calTaskList.pg for full example

[0455] </ivrForEach>

[0456] name: ivrGetApptInfo

[0457] syntax: ivrGetApptInfo($apptid, $recurid)

[0458] description: retrieves information about an appointment. Iprobably could have written this function so that information is loadedto state, but to stay consistent with the way appointment informationretrieved for appointments in a list, I did it this way.

[0459] restrictions: can be called only after ivrGetTasks has returnedsuccess

[0460] returns: a delimited string of the following format:

[0461]{apptid};{allday};{starttime};{endtime};{subject};{location};{description};{recurrenceID}

[0462] The delimiter is not necessarily a semicolon. It is defined byIvrCalDelim

[0463] example:

[0464] <ivrVar name=“apptInfo”expr=“ivrGetApptlnfo(‘${apptid}’,‘${recurid}’)”/>

[0465] name: ivrGetTodayDate

[0466] syntax: ivrGetTodayDate( )

[0467] description: gets the current date

[0468] restrictions: none

[0469] returns: date string in the format MMDDYY

[0470] example:

[0471] <ivrVar name=“today” expr=“ivrGetTodayDate( )”/>

[0472] name: ivrGetTomorrowDate

[0473] syntax: ivrGetTomorrowDate( )

[0474] description: gets tomorrow's date

[0475] restrictions: none

[0476] returns: date string in the format MMDDYY

[0477] example:

[0478] <ivrVar name=“tomorrow” expr=“ivrGetTomorrowDate( )”/>

[0479] name: ivrMoreAppts

[0480] syntax:ivrMoreAppts($apptcount, $page, $apptperpage)

[0481] description: checks if there are additional appointments for thecurrently loaded day that could not be displayed on the current page.

[0482] restrictions: can be called only after ivrGetAppts has returnedsuccess

[0483] returns: 1 if yes, 0 if no

[0484] example:

[0485] If you have 7 appointments ($apptcount) for a given day, and youdisplay 5 appointments per per page ($apptperpage), then to check if thesecond page ($page) has any appointments, you would use:

[0486] <ivrIf cond=“ivrMoreAppts(7,1,5)”>

[0487] . . .

[0488] </ivrIf>

[0489] Note that the $page value starts the count from 0.

[0490] Page 1 is 0. Page 2 is 1. And so on.

[0491] name: ivrGetApptID

[0492] syntax: ivrGetApptID($apptinfo)

[0493] description: retrieves the appointment id given a delimitedstring containing appointment information (see ivrGetApptList forformat). The delimiter is defined by IvrCalDelim

[0494] restrictions: none

[0495] returns: appointment ID string

[0496] example:

[0497] <ivrVar name=“id” expr=“ivrGetApptID(‘${apptInfo}’)”/>

[0498] name: ivrGetRecurID

[0499] syntax: ivrGetRecurID($apptinfo)

[0500] description: retrieves the recurrence id given a delimited stringcontaining appointment information (see ivrGetApptList for format). Thisvalue will be an empty string if the appointment is not a recurringappointment.

[0501] The delimiter is defined by IvrCalDelim

[0502] restrictions: none

[0503] returns: appointment ID string

[0504] example:

[0505] <ivrVar name=“recurid” expr=“ivrGetRecurID(‘${apptInfo}’)”/>

[0506] name: ivrIsAllDay

[0507] syntax: ivrIsAllDay($apptinfo)

[0508] description: retrieves whether of not an appointment is all daygiven a delimited string containing appointment information

[0509] (see ivrGetApptList for format)

[0510] The delimiter is defined by IvrCalDelim

[0511] restrictions: none

[0512] returns: 1 if all day, 0 if not

[0513] example:

[0514] <ivrVar name=“allday” expr=“ivrIsAllDay(‘${apptInfo}’)”/>

[0515] name: ivrGetApptStartTime

[0516] syntax: ivrGetApptStartTime($apptinfo)

[0517] description: retrieves the appointment start time given adelimited string containing appointment information (see ivrGetApptListfor format) The delimiter is defined by IvrCalDelim

[0518] restrictions: none

[0519] returns: the start time string in format YYYYMMDDTHHMMSS

[0520] example:

[0521] <ivrVar name=“starttime”expr=“ivrGetApptStartTime(‘${apptInfo}’)”/>

[0522] name: ivrGetApptEndTime

[0523] syntax: ivrGetApptEndTime($apptinfo)

[0524] description: retrieves the appointment end time given a delimitedstring containing appointment information (see ivrGetApptlnfo forformat) The delimiter is defined by IvrCalDelim

[0525] restrictions: none

[0526] returns: the end time string in format YYYYMMDDTHHMMSS example:

[0527] <ivrVar name=“endtime” expr=“ivrGetApptEndTime(‘${apptInfo}’)”/>

[0528] name: ivrGetApptSubject

[0529] syntax: ivrGetApptSubject($apptinfo)

[0530] description: retrieves the appointment subject given a delimitedstring containing appointment information (see ivrGetApptlnfo forformat) The delimiter is defined by IvrCalDelim

[0531] restrictions: none

[0532] returns: the subject string

[0533] example:

[0534] <ivrVar name=“subject” expr=“ivrGetApptSubject(‘${apptInfo}’)”/>

[0535] name: ivrGetApptLocation

[0536] syntax: ivrGetApptLocation($apptinfo)

[0537] description: retrieves the appointment location given a delimitedstring containing appointment information (see ivrGetApptlnfo forformat) The delimiter is defined by IvrCalDelim

[0538] restrictions: none

[0539] returns: the location string

[0540] example:

[0541] <ivrVar name=“location”expr=“ivrGetApptLocation(‘${apptInfo}’)”/>

[0542] name: ivrGetApptDescription

[0543] syntax: ivrGetApptDescription($apptinfo)

[0544] description: retrieves the appointment description given adelimited string containing appointment information (see ivrGetApptlnfofor format) The delimiter is defined by IvrCalDelim

[0545] restrictions: none

[0546] returns: the description string

[0547] example:

[0548] <ivrVar name=“description”expr=“ivrGetApptDescription(‘${apptInfo}’)”/>

[0549] name: ivrGetTaskDueDate

[0550] syntax: ivrGetTaskDueDate($taskinfo)

[0551] description: retrieves the task due date given a delimited stringcontaining task information (see ivrGetTaskList for format) Thedelimiter is defined by IvrCalDelim

[0552] restrictions: none

[0553] returns: due date string in format YYYYMMDDTHHMMSS

[0554] example:

[0555] <ivrVar name=“description”expr=“ivrGetTaskDueDate(‘${task_val}’)”/>

[0556] name: ivrGetTaskSummary

[0557] syntax: ivrGetTaskSummary($taskinfo)

[0558] description: retrieves the task summary given a delimited stringcontaining task information (see ivrGetTaskList for format) Thedelimiter is defined by IvrCalDelim

[0559] restrictions: none

[0560] returns: task summary string

[0561] example:

[0562] <ivrVar name=“summary” expr=“ivrGetTaskSummary(‘${task_val}’)”/>

[0563] name: ivrGetTaskDescription

[0564] syntax: ivrGetTaskDescription($taskinfo)

[0565] description: retrieves the task description given a delimitedstring containing task information (see ivrGetTaskList for format) Thedelimiter is defined by IvrCalDelim

[0566] restrictions: none

[0567] returns: task description string

[0568] example:

[0569] <ivrVar name=“description”expr=“ivrGetTaskDescription(‘${task_val}’)”/>

[0570] name: ivrCalDate

[0571] syntax: ivrCalDate($tz, $tstr, $df=DateFmt_dateFull)

[0572] description: takes a timezone ($tz, eg “PST8PDT”), and a timestring ($tstr, YYYYMMDDTHHMMSSZ), and a date format parameter(DateFmt_dateFull—default, DateFmt_dateTimeOnly, DateFmt_dateNoTime)

[0573] restrictions: none

[0574] returns: a friendly sounding version of the date.

[0575] example:

[0576] <ivrVar name=“friendlydate” expr=“ivrCalDate(‘PST8PDT’,‘20010419T060000Z’, DateFmt_dateFull)”/>

[0577] The friendlydate variable will now have the value “06/19/200106:00 AM”

[0578] name: ivrGetStandardDate

[0579] syntax: ivrGetStandardDate($nsdate)

[0580] description: Takes a date value in the format (MMDDYY) andconverts it into a more standard format

[0581] restrictions: none

[0582] returns: a date value in the format (YYYYMMDDT000000Z)

[0583] example:

[0584] <ivrVar name=“standarddate” expr=“ivrGetStandardDate(‘042401’)”/>

[0585] The standarddate variable now has the value “20010424T000000Z”

[0586] name: ivrIsValidDate

[0587] syntax: ivrIsValidDate( )

[0588] description: checks if a date in the format (MMDDYY) is valid.For example, “150101” and “029901” are obviously not valid dates. Itwill also guard against the 29th of February if it does not exist forthe specified year, etc.

[0589] restrictions: none

[0590] returns: “1” if it is a valid date. Otherwise “0”

[0591] example:

[0592] <ivrIf cond=“ivrIsValidDate(‘040512’)”>

[0593] . . .

[0594] </ivrIf>

[0595] name: ivrGetSSFEMsg

[0596] syntax: ivrGetSSFEMsg($callerid)

[0597] description: used as part of a WAPIVR session. If connecting froma WAP client to the IVR, the intent is to either listen to a message orrecord a reponse to the message. This function loads the message fromthe state server (SSFE).

[0598] restrictions: none

[0599] returns: 1 if success, 0 if error

[0600] example:

[0601] Use the following to check that the message is loadedsuccessfully.

[0602] If so, act upon it.

[0603] <ivrIf cond=“ivrGetSSFEMsg(‘${callerid}’)”>

[0604] . . .

[0605] </ivrIf>

[0606] name: ivrGetSSFEMsgUID

[0607] syntax: ivrGetSSFEMsgUID( )

[0608] description: retrieves the message ID of the currently loadedIVRWAP message

[0609] restrictions: ivrGetSSFEMsg must return a success

[0610] returns: message id string

[0611] example:

[0612] <ivrVar name=“msguid” expr=“ivrGetSSFEMsgUID( )”/>

[0613] name: ivrGetSSFEMsgAction

[0614] syntax: ivrGetSSFEMsgAction( )

[0615] description: retrieves the message action of the currently loadedIVRWAP message

[0616] restrictions: ivrGetSSFEMsg must return a success

[0617] returns: “l” is listening to a message, “c” if recording a replyto a message

[0618] examples:

[0619] <ivrVar name=“msgaction” expr=“ivrGetSSFEMsgAction( )”/>

[0620] name: ivrIsWap

[0621] syntax: ivrIsWap( )

[0622] description: checks if the session was started from a WAP client

[0623] restrictions: initial session state information has to be written

[0624] returns: 1 if session started from WAP client, 0 otherwise.

[0625] example:

[0626] <ivrIf cond=“ivrIsWap( )”>

[0627] . . .

[0628] </ivrIf>

[0629] name: ivrVoicemailAppend

[0630] syntax: ivrVoicemailAppend($audioBody, $append)

[0631] description: if $append==1, appends $audioBody to session stateif $append==0, sets $audioBody to session state

[0632] restrictions: Currently supports the audioBody in au or wavformat.

[0633] returns: 1 if successful, 0 if failed.

[0634] name: ivrDropoffDeposit

[0635] syntax: ivrDropoffDeposit($pri=0)

[0636] description: delivers the voicemail previously buffered insession state (through ivrVoicemailAppend) to the recipient. (This isused in the “deposit message” callflow.

[0637] $pri is the priority of the message. 1 is for urgent, 0 is fornormal.

[0638] returns: 1 if successful, 0 if failed.

[0639] name: ivrSendmsgDeposit

[0640] syntax: ivrSendmsgDeposit($action, $pri=0)

[0641] description: delivers the voicemail previously buffered insession state (through ivrVoicemailAppend) to the recipient. (This isused in the “send message” callflow).

[0642] $action is the action for the message. $action can be one of thefollowing value:

[0643] “ra”: reply to all

[0644] “rs”: reply to sender

[0645] “fwd”: forward

[0646] $pri is the priority of the message. 1 is for urgent, 0 is fornormal.

[0647] returns: 1 if successful, 0 if failed.

[0648] name: ivrFolderNumMsgs

[0649] syntax: ivrFolderNumMsgs($type=″″)

[0650] description: returns the number of messages in the currentfolder.

[0651] If $type is specified, only messages of those type are counted.If type is not specified, the total number of all messages in the folderis returned.

[0652] $type=‘e’ for email, ‘v’ for voice mail, and ‘f’ for faxes

[0653] restrictions: can only be called after ivrLogin has returnedsuccess example: <ivrIf cond=“ivrFolderNumMsgs(‘v’)”> <ivrPrompt>tolisttovm</ivrPrompt> </ivrIf>

[0654] B. Objects

[0655] The following objects are examples of objects which may beincluded in the described system. Of course, additional objects can bedefined, and these objects can be added to the system on-the-fly. Foreach objects described below, the object name, syntax, description andparameters of the object type are given, along with any applicablerestrictions, and where appropriate, examples of usage.

[0656] name: ivrFolderSummary

[0657] syntax: <ivrObject name=“ivrFolderSummary”>  [<param name=“force”value=“1”/>]  [<param name=“enable” value=“1”/>] </ivrObject>

[0658] description: emits <audio> tags for the folder summary (you have1 new voice . . . ). The tags are output if either the “force” param isset to “1”, or the previous call to ivrFolderSummary object had the“enable” param set to “1”.

[0659] restrictions: should be used only in a <prompt> tag, unless thethe “enable” param is used.

[0660] parameters:

[0661] force=if set to 1, always play summary

[0662] enable=if set to 1 the next time ivrFolderSummary is called thesummary will play once, and enable will be reset to 0.

[0663] examples:

[0664] 1. This call enables the folder summary object so the next timeit is called it will play a summary <ivrObject name=“ivrFolderSummary” <param name=“enable” value=“1”/> </ivrObject>

[0665] 2. This call will play the summary if the previous call toivrFolderSummary was with “enable” set to “1”. <prompt>  <ivrObjectname=“ivrFolderSummary”/> </prompt>

[0666] name: ivrGetPhoneStatus

[0667] syntax: <ivrObject name=“ivrGetPhoneStatus”>  [<paramname=“extension” value=“nnnn”/>] </ivrObject>

[0668] description: Makes a call to the backend server to retrieve thestatus of the current phone number. Used with the ivrPhoneStatus( )function.

[0669] restrictions: should only be called after the ivrGetPhoneInfoobject has been called.

[0670] parameters:

[0671] extension=set to the extension if this number is associated withextensions.

[0672] examples:

[0673] 1. Get the phone status for the current phone number. <ivrObjectname=“ivrGetPhoneStatus”/>  <ivrSwitch expr=“ivrPhoneStatus()”> <ivrCase expr=“IvrStatusAccountActive”/>   ...  <ivrCaseexpr=“IvrStatusAccountMaintenance”/>   ...  </ivrSwitch>

[0674] 2. Same as above, but shows how the extension is passed in. Theextension is obtained by prompting the user to enter it. <ivrObjectname=“ivrGetPhoneStatus”>  <param name=“extension”value=”${extension}”/> </ivrObject> <ivrSwitch expr=“ivrPhoneStatus()”> ... </ivrSwitch>

[0675] name: ivrGetPhoneInfo

[0676] syntax: <ivrObject name=“ivrGetPhoneInfo ”>  [<paramdnis=“extension” value=“nnnnnnnnnn”/>]  [<param ani=“extension”value=“nnnnnnnnnn”/>]  [<param rdnis=“extension” value=“nnnnnnnnnn”/>]</ivrObject>

[0677] description: Makes a call to the backend server server toretrieve information about a phone number. Used with the ivrPhoneFlowand ivrPhonePrimaryType functions.

[0678] restrictions: should only be called once per session

[0679] parameters:

[0680] dnis=the terminating phone number

[0681] ani=caller-id of the caller

[0682] rdnis=the phone number that was originally called in the case ofa redirect

[0683] examples:

[0684] 1. the variables dnis/ani/rdnis are passed from the VXML browserusing the variables session.telephone.ani, session.telephone.dnis, andsession.telephone.rdnis. After calling ivrGetPhoneInfo, the ivrPhoneFlowfunction is used to determine the type of call flow to use for thesession. <ivrObject name=“ivrGetPhoneInfo”>  <param name=“dnis”value=“${dnis}”/>  <param name=“ani” value=“${ani:unknown}”/>  <paramname=“rdnis” value=“${rdnis:unknown}”/> </ivrObject> <ivrIfcond=“ivrPhoneFlow() == IvrFlowOnebox”>  <ivrGotoFlow flow=“iso”/><ivrElse/>  <ivrPrompt>systemdown</ivrPrompt> <exit/>

[0685] name: ivrOrderFolder

[0686] syntax: <ivrObject name=“ivrOrderFolder”>  [<param name=“type”value=“e|v|f”/>] </ivrObject>

[0687] description: orders a folder for processing a particular type ofmessage. The order is new urgent messages, followed by new messages,followed read messages. used in conjunction with the ivrGetMsg andivrFinishMsg functions.

[0688] restrictions: should only be called at the start of processmessages in a folder.

[0689] parameters:

[0690] type=‘e’ for email, ‘v’ for voice mail, and ‘f’ for faxes.

[0691] examples:

[0692] 1. This orders the current folder for processing email messages.<ivrObject name=“ivrOrderFolder”>  <param name=“type” value=“e”/></ivrObject>

[0693] name: ivrGreetingPrompts

[0694] syntax: <ivrObject name=“ivrGreetingPrompts”>  [<paramname=“mboxfull” value=“0|1”/>] </ivrObject>

[0695] description: emits the <audio> tags for playing the greeting ofthe current phone number.

[0696] restrictions: should be used only within a <prompt> tag. shouldonly be called after ivrGetPhoneInfo has been called.

[0697] parameters:

[0698] mboxfull=should be set to 1 if the mailbox is full

[0699] examples:

[0700] 1. plays the greetings for the current phone number. <promptbargein=“true”>  <ivrObject name=“ivrGreetingPrompts”>   <paramname=“mboxfull” expr=“ivrMailboxFull()”/>  </ivrObject> </prompt>

[0701] name: ivrAddrbookEntry

[0702] syntax: <ivrObject name=“ivrAddrbookEntry”>  [<paramname=“entryIndex” value=“nnn”/>] </ivrObject>

[0703] description: emits <audio> tags for TTS of the specified addressbook entry

[0704] restrictions: should only be used in a <prompt> tag

[0705] parameters:

[0706] entryIndex=index into the currently selected entries from theuser's address book

[0707] examples:

[0708] 1. output the address book entry that the variable “abe” pointsto. <prompt bargein=“true”>  <ivrObject name=“ivrAddrbookEntry”>  <param name=“entryIndex” value=“${abe}”/>  </ivrObject> </prompt>

[0709] name: ivrMsgStatusPrompt

[0710] syntax:

[0711] <ivrObject name=“ivrMsgStatusPrompt”/>

[0712] description: emits <audio>tags that describe the status of thecurrent message. For example “first new email”, or “next deleted fax”.

[0713] restrictions: should only be used within a <prompt> tag, and onlyused after the ivrGetMsg( ) function has been called.

[0714] parameters: <none>

[0715] examples:

[0716] 1. play the status of the current message <prompt> <ivrObjectname=“ivrMsgStatusPrompt”/> </prompt>

[0717] name: ivrMsgEnvelope

[0718] syntax: <ivrObject name=“ivrMsgEnvelope”> [<param name=“full”value=“0|1”/>] </ivrObject>

[0719] description: emits <audio> tags that play message envelopeinformation, such as the time received, the sender, etc.

[0720] restrictions: should only be used within a <prompt> tag, and onlyused after the ivrGetMsg( ) function has been called.

[0721] parameters:

[0722] full=set to 1 if the full envelope (which includes messageduration for voice mail and number of pages for faxes) is to be played.

[0723] examples: play the message envelope. <ivrVar name=“fullEnvelope”expr=“0”/> ... <prompt>  <ivrIf cond=“ivrDateTimeIsOn( )”>  <ivrObjectname=“ivrMsgEnvelope”>   <param name=“full” expr=“${fullEnvelope}||ivrMsgIsFax( )”/>   </ivrObject>  </ivrIf>  </prompt>

[0724] name: ivrListenedToMsg

[0725] syntax:

[0726] <ivrObject name=“ivrListenedToMsg”/>

[0727] description: should be called if the user listened to the entiremessage.

[0728] restrictions: should only be used after ivrGetMsg( ) has beencalled to set the current message.

[0729] parameters: <none>

[0730] examples: This example shows the ivrListenedToMsg object beingcalled if the “seen” variable is set to 1. <ivrIf cond=“${seen}”> <ivrObject name=“ivrListenedToMsg”/> </ivrIf>

[0731] name: ivrInitSession

[0732] syntax:

[0733] <ivrObject name=“ivrInitSession”/>

[0734] description: initials a session. After calling this function, theglobal variable $SID is set to the session ID.

[0735] restrictions: <none>

[0736] parameters: <none>

[0737] examples: <ivrObject name=“ivrInitSession”/>

[0738] name: ivrEndSession

[0739] syntax: <ivrObject name=“ivrEndSession”>  [<param name=“event”value=“...”/>]  [<param name=“subevent” value=“...”/>]  [<paramname=“info” value=“...”/>] </ivrObject>

[0740] description: ends the current session

[0741] restrictions: should only be called after calling ivrInitSession

[0742] parameters:

[0743] event=vxml event, if one was thrown

[0744] subevent=openwave subevent if one was thrown

[0745] info=any extra textual information to log

[0746] name: ivrMsgContent

[0747] syntax: <ivrObject name=“ivrMsgContent”>  [<param name=“reset”value=“”/>] </ivrObject>

[0748] description: emits audio tags for playing the content of thecurrent message, appropriate for the message type. Can either emit audiofor the entire message all at once, or loop over the message and emitaudio part-by-part. Also, if the part requires TTS, such as an emailbody, it can break the text up into chunks and loop over those overmultiple requests. This behavior is controlled through configurableapplication options.

[0749] When looping over a message, the ivrMsgMoreParts( ) call can beused to determine whether there are more parts to be played.

[0750] restrictions: <restrictions>

[0751] parameters:

[0752] reset=if looping, set this to 1 to start over and replay theentire message from the beginning again.

[0753] example: <ivrIf cond=“${playContent}”>  <ivrObjectname=“ivrMsgContent”>   <param name=“reset” value=“${contentReset:1}”/> </ivrObject> </ivrIf>

[0754] name: ivrInitializeSend

[0755] syntax:

[0756] <ivrObject name=“ivrInitializeSend”/>

[0757] description: Must be called before sending, forwarding orreplying to a message, before beginning to select recipients. Sessionstate is used to track selected users for sending messages, and callingthis ensures that the session state is cleared of any previous entries.

[0758] restrictions: Must be called before beginning to selectrecipients for sending, forwarding or replying to a message,

[0759] parameters: <none>

[0760] name: ivrGotoFlow

[0761] syntax: <ivrObject name=“ivrGotoFlow”>  <param name=“flow”value=“...”/>  [<param name=“page” value=“...”/>] </ivrObject>

[0762] description: updates session data and emits a <goto> tag thatstarts executing the specified callflow. also places the session id inthe URL, as well as the server name and port for server affinity.

[0763] restrictions: should only be used where a <goto> tag is allowed.should only be called after the ivrInitSession function has been called.

[0764] parameters:

[0765] flow=name of the flow

[0766] page=optional name of page within the specified flow to beginexecution. If not specified, the page specified in the

[0767] <ivrCallFlow>“initial” attribute will be used.

[0768] examples:

[0769] 1. Goto the iso call flow, and execute the page specified in the“initial” attribute of the <ivrCallFlow> tag. <ivrObjectname=“ivrGotoFlow”>  <param name=“flow” value=“iso”/> </ivrObject>

[0770] 2. Goto the “test” call flow, and execute the page named “hello”.<ivrObject name=“ivrGotoFlow”>  <param name=“flow” value=“test”/> <param name=“page” value=“hello”/> </ivrObject>

[0771] expanded VXML:

[0772] The first example expands to:

[0773] <goto next=“http://{TOP}/ivr/sid-{SID}/engine?flow=iso”/>

[0774] Where {TOP} is the hostname and port of the webserver, and {SID}is the session id.

[0775] The second example expands to:

[0776] <gotonext=“http://{TOP}/ivr/sid-{SID}/engine?flow=test&page=hello”/>

[0777] NOTE: The exact format of the URL is subject to change, but thistag will always result in a <goto . . . > tag being generated.

[0778] name: ivrDtmfDigits

[0779] syntax: <ivrObject name=“ivrDtmfDigits”>  <param name=“length”value=“n”/> </ivrObject>

[0780] where n is a positive integer.

[0781] description: Generates fixed length digits dtmf grammar.

[0782] restrictions: allowed anywhere a VXML <dtmf> tag is allowed.

[0783] attributes:

[0784] length=length of the digits.

[0785] example: <ivrObject name=“ivrDtmfDigits”>  <param name=“length”value=“4”/> </ivrObject>

[0786] expands to:

[0787] On VXML browsers that support builtin: grammers:

[0788] <dtmf src=“builtin:dtmf/digits?length=4”/>for VG

[0789] and on the Cisco VXML browsers it will generate:

[0790] <dtmf type=“regex”> . . . </dtmf>

[0791] name: <name>

[0792] syntax: <ivrObject name=“”>  [<param name=“” value=“”/>]</ivrObject>

[0793] description: <desc>

[0794] restrictions: <restrictions>

[0795] parameters: <none>

[0796] example: <ivrObject name=″″/>

[0797] Thus, a method and apparatus for using VXML extensions toincorporate application logic into a voice responsive system have beendescribed. Although the present invention has been described withreference to specific exemplary embodiments, it will be evident thatvarious modifications and changes may be made to these embodimentswithout departing from the broader spirit and scope of the invention asset forth in the claims. Accordingly, the specification and drawings areto be regarded in an illustrative sense rather than a restrictive sense.

What is claimed is:
 1. A method comprising: creating a VXML based callflow document for use by a server in a voice responsive system to definea call flow, including incorporating a VXML extension element into thecall flow document to provide application logic for the call flow; andstoring the call flow document in the voice responsive system.
 2. Amethod as recited in claim 1, wherein the VXML extension elementspecifies application logic.
 3. A method as recited in claim 2, whereinthe a VXML extension element specifies a conditional control flow.
 4. Amethod as recited in claim 1, wherein the VXML extension elementspecifies a logically separate executable entity that containsapplication logic.
 5. A method as recited in claim 1, wherein saidexecuting the application logic comprises invoking an application-leveloperation on a remote server as part of the call flow based on one ofthe VXML extension elements.
 6. A method of providing a voiceapplication, the method comprising: receiving request from a voicebrowser; in response to the request, parsing a call flow document, thecall flow document including a plurality of predefined VXML extensionelements to incorporate application logic into a call flow; andexecuting the application logic based on the VXML extension elements. 7.A method as recited in claim 6, wherein the plurality of VXML extensionelements include a VXML extension element specifying application logic.8. A method as recited in claim 7, wherein the a VXML extension elementspecifies a conditional control flow.
 9. A method as recited in claim 6,wherein the plurality of VXML extension elements include a VXMLextension element specifying a logically separate entity that containsapplication logic.
 10. A method as recited in claim 6, wherein saidexecuting the application logic comprises invoking an application-leveloperation on a remote server as part of the call flow based on one ofthe VXML extension elements.
 11. A method of executing a call flow in avoice responsive processing system, the method comprising: accessing anXML based document in response to a request from a remote entity;identifying a tag in the XML based document; determining whether the tagis a predefined XML extension element; and if the tag is a predefinedXML extension element, then executing call flow logic corresponding tothe tag.
 12. A method as recited in claim 11, wherein the XML baseddocument is a VXML based document, and the predefined XML extensionelement is a predefined VXML extension element.
 13. A method as recitedin claim 11, wherein the tag is a predefined XML extension elementspecifying call flow logic.
 14. A method as recited in claim 13, whereinthe tag specifies a conditional control flow.
 15. A method as recited inclaim 11, wherein the tag is a predefined XML extension elementspecifying a logically separate entity that contains call flow logic.16. A method as recited in claim 11, wherein said executing call flowlogic comprises invoking an application-level operation on a remoteserver as part of the call flow based on the tag.
 17. A method ofoperating a server in a voice responsive processing system, the methodcomprising: receiving a request at the voice server from a voicebrowser; accessing a VXML based document in response to the request;parsing the call flow document, including identifying a tag in the VXMLdocument; determining whether the tag is a standard VXML tag; if the tagis a standard VXML tag, then outputting the tag to the voice browser; ifthe tag is not a standard VXML tag, determining whether the tag is apredefined VXML extension element; if the tag is a predefined VXMLextension element, then executing call flow logic corresponding to thetag.
 18. A method as recited in claim 17, wherein the tag is apredefined VXML extension element specifying call flow logic.
 19. Amethod as recited in claim 18, wherein the tag specifies a conditionalcontrol flow.
 20. A method as recited in claim 17, wherein the tag is apredefined VXML extension element specifying a logically separate entitythat contains call flow logic.
 21. A method as recited in claim 17,wherein said executing call flow logic comprises invoking anapplication-level operation on a remote server as part of the call flowbased on the tag.
 22. A processing system to execute a call flow, theprocessing system comprising: a web server; and an engine configured tointerpret an XML document including a plurality of XML extensionelements which incorporate logic into the call flow.
 23. A processingsystem as recited in claim 22, wherein the document is a VXML baseddocument, and the plurality of XML extension elements comprise aplurality of VXML extension elements.
 24. A processing system as recitedin claim 23, wherein the plurality of VXML extension elements comprisesa predefined VXML tag specifying application logic.
 25. A processingsystem as recited in claim 24, wherein the tag specifies a conditionalcontrol flow.
 26. A processing system as recited in claim 23, whereinthe plurality of VXML extension elements comprises a predefined VXML tagspecifying a logically separate entity that contains application logic.27. A processing system as recited in claim 23, wherein the plurality ofVXML extension elements comprises a predefined VXML tag for invoking anapplication-level operation on a remote server as part of the call flow.28. A voice server comprising: a web server to respond to requests froma voice browser; and an engine responsive to the web server to interpreta set of one or more VXML based call flow documents, the set of VXMLbased call flow documents including a plurality of predefined VXMLextension elements, to incorporate logic into a call flow, the pluralityof VXML extension elements including a first VXML tag defined to specifyapplication logic, and a second VXML tag defined to reference alogically separate entity that specifies application logic.
 29. A voiceserver as recited in claim 28, wherein the plurality of VXML extensionelements includes a VXML extension element specifying execution of anapplication-level operation on a remote server as part of the call flow.30. A voice server as recited in claim 28, wherein each of the pluralityof VXML extension elements is capable of interaction with VXML code inwhich it is incorporated.
 31. A voice server as recited in claim 28,wherein the first VXML tag specifies conditional control flow.
 32. Avoice server as recited in claim 28, wherein the second VXML tagspecifies an object to be invoked as part of the call flow, the objectincluding application logic.
 33. A voice server as recited in claim 28,wherein the plurality of VXML extension elements includes a VXMLextension element specifying a prompt to be played as part of the callflow.
 34. A voice server as recited in claim 28, wherein the engineinterpreting one of the plurality of VXML extension elements causesadditional VXML code to be generated and provided to the voice browservia the VXML server in response to the request.
 35. An apparatuscomprising: means for receiving request from a voice browser; means forparsing a call flow document in response to the request, the call flowdocument including a plurality of predefined VXML extension elements toincorporate application logic into a call flow; and means for executingthe application logic based on the VXML extension elements.
 36. Anapparatus as recited in claim 35, wherein the plurality of VXMLextension elements include a VXML extension element specifyingapplication logic.
 37. An apparatus as recited in claim 36, wherein thea VXML extension element specifies a conditional control flow.
 38. Anapparatus as recited in claim 35, wherein the plurality of VXMLextension elements include a VXML extension element specifying alogically separate entity that contains application logic.
 39. Anapparatus as recited in claim 35, wherein the means for executing theapplication logic comprises means for invoking an application-leveloperation on a remote server as part of the call flow based on one ofthe VXML extension elements.
 40. A machine-readable storage mediumstoring a VXML based call flow document for use by a server in a voiceresponsive system to define a call flow, the call flow documentincluding a VXML extension element to provide application logic for thecall flow.
 41. A machine-readable storage medium as recited in claim 40,wherein the VXML extension element specifies application logic.
 42. Amachine-readable storage medium as recited in claim 41, wherein the aVXML extension element specifies a conditional control flow.
 43. Amachine-readable storage medium as recited in claim 40, wherein the VXMLextension element specifies a logically separate executable entity thatcontains application logic.
 44. A machine-readable storage medium asrecited in claim 40, wherein said executing the application logiccomprises invoking an application-level operation on a remote server aspart of the call flow based on one of the VXML extension elements.
 45. Amethod of modifying a call flow, the method comprising: storing a VXMLbased call flow document for use by a server in a voice responsivesystem, the call flow document defining a call flow and including a setof VXML extension elements for providing application logic for the callflow; and modifying the call flow by modifying the stored call flowdocument in the voice responsive system while the voice responsivesystem is in operation.
 46. A method as recited in claim 45, whereinsaid modifying comprises adding, deleting or modifying a VXML extensionelement in the call flow document.